package com.atguigu.gmall.realtime.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;

import java.sql.Connection;
import java.util.List;

/**
 * @Author lzc
 * @Date 2022/4/19 10:34
 */
public class DimUtil {
    public static JSONObject readDimFromPhoenix(Connection phoenixConn, String tableName, String id) throws Exception {
        //TODO
        // 执行sql语句: 查询
        String sql = "select * from " + tableName + " where id=?";
        Object[] args = {id.toString()};
        List<JSONObject> list = JdbcUtil.queryList(phoenixConn, sql, args, JSONObject.class);
        return list.get(0); // 由于特定dql, 返回的集合中只有一个, 直接返回
    }
    
    public static JSONObject readDim(Jedis redisClient, Connection phoenixConn, String tableName,
                                     String id) throws Exception {
        // 1. 先从redis读维度信息,如果读到数据,则直接返回
        JSONObject dim = readDimFromRedis(redisClient, tableName, id);
        if (dim == null) {
            System.out.println(tableName + " " + id + "  走数据库....");
            // 2. 如果没有读到数据, 则从phoenix中读, 然后返回. 并且把读到的数据, 写入到redis中
            dim = readDimFromPhoenix(phoenixConn, tableName, id);
            
            writeDimToRedis(redisClient, tableName, id, dim);
        } else {
            System.out.println(tableName + " " + id + "  走redis....");
        }
        return dim;
    }
    
    private static void writeDimToRedis(Jedis redisClient, String tableName, String id, JSONObject dim) {
        String key = tableName + ":" + id;
        String value = dim.toJSONString();
        
        
        /*redisClient.set(key, value);
        redisClient.expire(key, 2 * 24 * 60 * 60);*/
        redisClient.setex(key, 2 * 24 * 60 * 60, value);
        
    }
    
    private static JSONObject readDimFromRedis(Jedis redisClient, String tableName, String id) {
        String key = tableName + ":" + id;
        String json = redisClient.get(key);
        if (json != null) {
            return JSON.parseObject(json);
        }
        return null;
    }
}
/*
redis选择什么样的数据结构?
string
    key              value
    table:id          json格式字符串
    
    好处:
        1. 读写方便
        2. 单独给每个维度数据设置过期时间
    
    坏处:
        key过多, 不方便管理
        
        单独选择一个数据库

list

    key     value
    table    json格式字符串, ....
    
    好处:
    1. key不会膨胀
    2. 存储方便
    坏处:
    1. 读取不方便
    2. 没有办法给每个维度数据单独设置过期时间

set

hash

key             field         value
table             id          json格式字符
                  id          json格式字符串


好处:
1.读写方便
2. key不多

坏处:
 没有办法给每个维度数据单独设置过期时间



zset



 */

